package com.zenithmind.mall.pojo.entity;

import com.baomidou.mybatisplus.annotation.TableName;
import com.zenithmind.common.base.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Objects;

/**
 * 秒杀商品实体 - 遵循单一职责原则，专门管理秒杀商品信息
 * 
 * @author ZenithMind Team
 * @since 2025-07-03
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("mall_seckill_product")
public class SeckillProduct extends BaseEntity {

    /**
     * 秒杀活动ID
     */
    private String activityId;

    /**
     * 商品ID
     */
    private String productId;

    /**
     * 秒杀价格
     */
    private BigDecimal seckillPrice;

    /**
     * 原价
     */
    private BigDecimal originalPrice;

    /**
     * 秒杀库存
     */
    private Integer seckillStock;

    /**
     * 已售数量
     */
    private Integer soldCount;

    /**
     * 限购数量（每人限购）
     */
    private Integer limitPerUser;

    /**
     * 秒杀开始时间
     */
    private LocalDateTime startTime;

    /**
     * 秒杀结束时间
     */
    private LocalDateTime endTime;

    /**
     * 状态（0-未开始，1-进行中，2-已结束，3-已售罄）
     */
    private Integer status;

    /**
     * 排序号
     */
    private Integer sortOrder;

    /**
     * 是否启用（0-禁用，1-启用）
     */
    private Integer enabled;

    /**
     * 版本号（用于乐观锁）
     */
    private Integer version;

    // 业务方法

    /**
     * 检查是否未开始
     */
    public boolean isNotStarted() {
        return Objects.equals(this.status, 0);
    }

    /**
     * 检查是否进行中
     */
    public boolean isActive() {
        return Objects.equals(this.status, 1);
    }

    /**
     * 检查是否已结束
     */
    public boolean isEnded() {
        return Objects.equals(this.status, 2);
    }

    /**
     * 检查是否已售罄
     */
    public boolean isSoldOut() {
        return Objects.equals(this.status, 3);
    }

    /**
     * 检查是否启用
     */
    public boolean isEnabled() {
        return Objects.equals(this.enabled, 1);
    }

    /**
     * 检查是否在秒杀时间范围内
     */
    public boolean isInSeckillTime() {
        LocalDateTime now = LocalDateTime.now();
        return (startTime == null || !now.isBefore(startTime)) &&
               (endTime == null || !now.isAfter(endTime));
    }

    /**
     * 检查是否可以参与秒杀
     */
    public boolean canSeckill() {
        return isEnabled() && isActive() && isInSeckillTime() && hasStock();
    }

    /**
     * 检查是否有库存
     */
    public boolean hasStock() {
        return getRemainingStock() > 0;
    }

    /**
     * 获取剩余库存
     */
    public Integer getRemainingStock() {
        int total = seckillStock != null ? seckillStock : 0;
        int sold = soldCount != null ? soldCount : 0;
        return Math.max(0, total - sold);
    }

    /**
     * 检查用户是否可以购买指定数量
     */
    public boolean canBuy(Integer quantity) {
        if (quantity == null || quantity <= 0) {
            return false;
        }
        
        // 检查限购数量
        if (limitPerUser != null && quantity > limitPerUser) {
            return false;
        }
        
        // 检查库存
        return getRemainingStock() >= quantity;
    }

    /**
     * 扣减库存（使用乐观锁）
     */
    public boolean decreaseStock(Integer quantity) {
        if (!canBuy(quantity)) {
            return false;
        }
        
        this.soldCount = (this.soldCount != null ? this.soldCount : 0) + quantity;
        
        // 检查是否售罄
        if (getRemainingStock() <= 0) {
            this.status = 3; // 已售罄
        }
        
        return true;
    }

    /**
     * 计算折扣率
     */
    public BigDecimal getDiscountRate() {
        if (originalPrice == null || originalPrice.compareTo(BigDecimal.ZERO) <= 0 ||
            seckillPrice == null || seckillPrice.compareTo(BigDecimal.ZERO) <= 0) {
            return BigDecimal.ZERO;
        }
        
        return originalPrice.subtract(seckillPrice)
                          .divide(originalPrice, 2, java.math.RoundingMode.HALF_UP);
    }

    /**
     * 计算节省金额
     */
    public BigDecimal getSavedAmount() {
        if (originalPrice == null || seckillPrice == null) {
            return BigDecimal.ZERO;
        }
        
        return originalPrice.subtract(seckillPrice);
    }

    /**
     * 开始秒杀
     */
    public void startSeckill() {
        if (isNotStarted() && isEnabled()) {
            this.status = 1;
        }
    }

    /**
     * 结束秒杀
     */
    public void endSeckill() {
        if (isActive()) {
            this.status = 2;
        }
    }

    /**
     * 获取状态名称
     */
    public String getStatusName() {
        if (status == null) return "未知";
        
        switch (status) {
            case 0: return "未开始";
            case 1: return "进行中";
            case 2: return "已结束";
            case 3: return "已售罄";
            default: return "未知";
        }
    }

    /**
     * 计算秒杀剩余时间（秒）
     */
    public Long getRemainingSeconds() {
        if (endTime == null) {
            return null;
        }
        
        LocalDateTime now = LocalDateTime.now();
        if (now.isAfter(endTime)) {
            return 0L;
        }
        
        return java.time.Duration.between(now, endTime).getSeconds();
    }

    /**
     * 计算距离开始时间（秒）
     */
    public Long getSecondsToStart() {
        if (startTime == null) {
            return null;
        }
        
        LocalDateTime now = LocalDateTime.now();
        if (now.isAfter(startTime)) {
            return 0L;
        }
        
        return java.time.Duration.between(now, startTime).getSeconds();
    }

    /**
     * 获取库存进度百分比
     */
    public Double getStockProgress() {
        if (seckillStock == null || seckillStock <= 0) {
            return 0.0;
        }
        
        int sold = soldCount != null ? soldCount : 0;
        return (double) sold / seckillStock * 100;
    }

    /**
     * 验证秒杀商品数据完整性
     */
    public boolean isValid() {
        return activityId != null && !activityId.trim().isEmpty() &&
               productId != null && !productId.trim().isEmpty() &&
               seckillPrice != null && seckillPrice.compareTo(BigDecimal.ZERO) > 0 &&
               originalPrice != null && originalPrice.compareTo(BigDecimal.ZERO) > 0 &&
               seckillStock != null && seckillStock > 0 &&
               status != null && status >= 0 && status <= 3 &&
               enabled != null;
    }
}
